package com.berchen.锁分段机制;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 锁分段机制：
 *
 * HashTable:线程安全的。效率低。
 * HashMap：线程不安全的，效率高。
 * 现在想要效率高并且线程安全，就产生了ConcurrentHashMap：
 * 锁分段机制:采用【锁分段】机制。
 *  底层其实就是将一个HashMap分成了16个Segment，每一个Segment都相当于是一个HashTable，每一个Segment都是一个独立的锁锁起来的。
 *
 *
 * CopyOnWriteArrayList：写入并复制。每次写入的时候都会复制一份新的List。所以并发修改异常就不会发生了。
 * 注意：
 *  1、添加操作多时，不适用。效率低。因为每次添加时都会进行一次复制，开销非常大。
 *  2、并发迭代操作多时，可以选择，能提高效率。
 */
public class TestCopyOnWriteArrayList {

    public static void main(String[] args){

        HelloThread helloThread = new HelloThread();
        for(int i=0;i<10;i++){

            new Thread(helloThread).start();
        }
    }
}
class HelloThread implements Runnable{

    // Collections.synchronizedList(); 将集合里面的方法都变成是同步方法。
//    private static List<String> list= Collections.synchronizedList(new ArrayList<>());

    private static CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<>();

    static {

        list.add("AA");
        list.add("BB");
        list.add("CC");
        list.add("DD");
    }
    @Override
    public void run() {

        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){

            System.out.println(iterator.next());

            // CopyOnWriteArrayList 这里添加就不会发生异常。
            list.add("Ff"); // 常规List这里插入会发生异常，并发修改异常。迭代器正在遍历。这里添加。
        }
    }
}
